from django.core.paginator import Paginator, PageNotAnInteger, EmptyPage
from django.http import HttpResponse, JsonResponse
from django.shortcuts import render
from more_itertools.more import first

from commodity.models import Types, CommodityInfos


# Create your views here.
def commodityView(request):
    title = '商品列表'
    classContent='commoditys'
    firsts=Types.objects.values('first').distinct()
    typesList=Types.objects.all()
    t=request.GET.get('t','')
    s=request.GET.get('s','sold')
    p=request.GET.get('p','1')
    n=request.GET.get('n','')
    commodityInfos=CommodityInfos.objects.all()
    if t:
        types=Types.objects.filter(id=t).first()
        commodityInfos=CommodityInfos.filter(type=types.seconds)
    if s:
        commodityInfos=CommodityInfos.order_by('-'+s)
    if n:
        commodityInfos=CommodityInfos.filter(name__contains=n)
    paginator = Paginator(commodityInfos, 6)
    try:
        pages=paginator.page(p)
    except PageNotAnInteger:
        pages=paginator.page(1)
    except EmptyPage:
        pages=paginator.page(paginator.num_pages)

    return render(request,'commodity.html',locals())

def detailView(request, id):
    title = '商品介绍'
    classContent = 'details'
    items = CommodityInfos.objects.exclude(id=id).order_by('-sold')[:5]
    commoditys = CommodityInfos.objects.filter(id=id).first()
    likesList = request.session.get('likes', [])
    likes = True if id in likesList else False

    return render(request, 'details.html', locals())

def collectView(request):
    """
    商品收藏视图函数（AJAX接口）
    - 处理用户的收藏请求
    - 更新商品收藏的数量
    - 记录用户收藏状态到Session
    Session Cookie
    """
    # 首先从请求对象request获取请求参数id的值，并赋值给变量id
    # 代表当前商品的主键id
    id = request.GET.get('id', '')
    # 然后设置响应内容result，以字典的形式表示
    result = {"result": "已收藏"}
    # 最后从请求对象request获取会话Session数据likes，
    # 如果存在数据，那么赋值给变量likes，否则变量likes设置为空列表
    likes = request.session.get('likes', [])
    # 如果变量id不为空，并且变量id不在likes中，那么说明当前的商品
    # 还没有被当前用户加入收藏，程序将执行商品收藏的操作
    if id and not int(id) in likes:
        # 使用F表达式原子性的增加商品收藏数，避免并发问题
        # 将变量id作为模型CommodityInfos的查询条件，再由查询对象使用update方法和F方法
        # 实现字段likes的自增一操作
        CommodityInfos.objects.filter(id=id).update(likes=F('likes') + 1)
        # 然后将响应内容result改为收藏成功
        result["result"] = "收藏成功"
        # 最后，将当前商品的id写入会话session数据likes，标记当前商品已经被用户收藏了
        request.session['likes'] = likes + [int(id)]
    # 返回JSON的响应
    # JsonResponse有将Python的字典转换为JSON数据
    # 使用HttpResponse实现：
    # HttpResponse(json.dumps(result), content_type='application/json')
    return JsonResponse(result)